class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        //首先确定链表的节点个数为多少
        int n = 0;
        for(ListNode* cur = head;cur;cur = cur->next)
        {
            n++;
        }
        //这道题目需要确定至少三个点；第一个是前一组交换节点的结束节点，然后就是中间的交换节点
        //最后就是下一组交换节点的开始节点
        ListNode* newhead = new ListNode();
        ListNode* ret = newhead;
        newhead->next = head;
        ListNode* p0 = newhead;//这就是上一组交换的结束节点
        ListNode* cur = head;
        ListNode* pre = nullptr;//两两交换接待你
        //进行交换   
        for(;n>=k;n-=k)
        {
            //k个一组进行翻转
            for(int i = 0;i<k;i++)
            {
                ListNode* nxt = cur->next;
                cur->next = pre;
                pre = cur;
                cur = nxt;
                //交换pre节点和next节点
            }//这一组的k个已经交换完成了,这个循环结束的时候cur指向的就是下一组要交换的开始节点
            ListNode* next = newhead->next;//newhead->next就是这一次翻转的结束节点而cur指向的就是下一组交换节点的开始
            newhead->next->next = cur;//将这一组要交换的结束节点指向下一组要交换的结束节点
            newhead->next = pre;
            newhead = next;//让newheada再次指向上一组交换的结束节点，这个节点的next就是下一组交换的结束节点
        }//如果链表的长度小于了k就不会进行翻转
        return ret->next;
    }
};